package set

import "constraints"

// Set 集合，包含一组不重复出现的元素
// 数据项必须是可以排序的
type Set[T constraints.Ordered] interface {
	// Add 添加数据元素，已经存在则忽略
	Add(elements ...T)

	// Remove 删除一个元素
	Remove(elements ...T)

	// Contains 元素存在返回true，反之返回false
	Contains(ele T) bool

	// Iterator 迭代元素
	// 当 fn 返回 false 的时候停止迭代
	Iterator(fn func(ele T) bool)

	// Len 返回元素的数量
	Len() int

	// Reset 清空容器
	Reset()

	// Slice 返回切片
	Slice() []T

	// Clone 克隆
	Clone() Set[T]

	// Union 并集
	// {1,2,3},{2,3,4} => {1,2,3,4}
	Union(set Set[T]) Set[T]

	// Intersect 交集
	// {1,2,3},{2,3,4} => {2,3}
	Intersect(set Set[T]) Set[T]

	// Difference 差集
	// {1,2,3},{2,3,4} => {1}
	Difference(set Set[T]) Set[T]

	// SymmetricDifference 对称差集
	// {1,2,3},{2,3,4} => {1,4}
	SymmetricDifference(set Set[T]) Set[T]

	// ---------------------------------
	// 以下方法用于系列化和反系列化
	// ---------------------------------

	// MarshalText 实现 `encoding.TextUnmarshaler` 接口
	// 用于 `json.Marshal`
	MarshalText() ([]byte, error)

	// UnmarshalText 实现 `encoding.TextUnmarshaler` 接口
	UnmarshalText(data []byte) error

	// UnmarshalJSON 实现 `json.Unmarshaler` 接口
	// 用于 `json.UnmarshalJSON`
	UnmarshalJSON(data []byte) error
}
